﻿Перем ШагСтрокДляМодуля;
Перем ОбъектКонтекст;
Перем ОбъектКонтекстСохраняемый Экспорт;
 
Перем ЭтоУФ;
 
Перем ВыполнятьСценарииАсинхронно;
 
Перем МассивСценариевДляВыполнения;
Перем ТекИД_СценарияВМассиве;
Перем ТекИД_ШагаВМассиве;
Перем ТекИД_ВыполненногоШагаВМассиве;
 
Перем МассивКонтекстовОбработок;
Перем МассивИменКонтекстовОбработок;
 
Перем ЦветУспешно;
Перем ЦветОжидает;
Перем ЦветНеУспешно;
Перем ЦветЧужойСнипет;

Перем СтруктураПараметровДляСамотестирования Экспорт;

Перем ХостСистема Экспорт;

Перем СтатусЗапускаСценариев;
 
Перем ВсёЕщёИдётВыполнениеШагов;

Перем ТаблицаУжеСуществующихСценариев;
Перем ТаблицаИзвестныхStepDefinition;
Перем ТаблицаВерсийEPF;
Перем ТаблицаВерсийFeature;
Перем ОбработкаСвязаннаяСИсполняемойФичей Экспорт;

 
 


Процедура Приостановить(Интервал)
	//Сообщить("Начало sleep...");
	НовЗнач = ТекущаяУниверсальнаяДатаВМиллисекундах() + Интервал;
	Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < НовЗнач Цикл
		Продолжить;
	КонецЦикла; 
	//Сообщить("Окончание sleep...");
КонецПроцедуры
 
Процедура ВызватьМетод(Обработка, Знач ИмяПроцедуры, МассивАргументов)
	Поз = Найти(ИмяПроцедуры,"(");
	Если Поз > 0 Тогда
		ИмяПроцедуры = Лев(ИмяПроцедуры,Поз-1);
	КонецЕсли;	 
	
	Команда = "Обработка." + ИмяПроцедуры + "(";
	
	АргументТаблица = Неопределено;
	
	Если МассивАргументов <> Неопределено Тогда
		Для Ккк = 0 По МассивАргументов.Количество()-1 Цикл
			Элем = МассивАргументов[Ккк];
			Если ТипЗнч(Элем) = Тип("Массив") Тогда
				АргументТаблица = Элем;
				Команда = Команда + "АргументТаблица";
			Иначе	
				Команда = Команда + Элем;
			КонецЕсли;	 
			
			Если Ккк < МассивАргументов.Количество()-1 Тогда
				Команда = Команда + ",";
			КонецЕсли;	 
		КонецЦикла;
	КонецЕсли;	 
	
	Команда = Команда + ")";
	
	Отладка("Выполняю: " + Команда);
	Выполнить(Команда);
КонецПроцедуры

Процедура ПриЗакрытии()
	СохранитьНастройки();
	//WinSocket1 = ЭлементыФормы.WinSocket;
	//WinSocket1.Close();
КонецПроцедуры
 
Процедура ОсновныеДействияФормыНачатьЗапись(Кнопка)
	ОбъектКонтекст.ТестируемоеПриложение.НачатьЗаписьЖурналаДействийПользователя();
КонецПроцедуры
 
Процедура ОсновныеДействияФормыОстановитьЗапись(Кнопка)
	Стр = ОбъектКонтекст.ТестируемоеПриложение.ЗавершитьЗаписьЖурналаДействийПользователя();
	
	
	ПутьКОбработке = КаталогИнструментов + "\vendor\1C\UILogToScript.epf";
	Файл = Новый Файл(ПутьКОбработке);
	Если Файл.Существует() Тогда
		Обработка = ВнешниеОбработки.Создать(ПутьКОбработке); 
		Результат = Обработка.Convert(Стр);
		ОчиститьСообщения();
		Сообщить(Результат);
	Иначе	
		Сообщить(Стр);
	КонецЕсли;	 
	
КонецПроцедуры



Процедура ЗаписатьЛогВЖРПередВыполнениемШага(ИмяШага)
	ЗаписьЖурналаРегистрации("VanessaBehavior.ПередВыполнениемШага",УровеньЖурналаРегистрации.Информация,,,ИмяШага);
КонецПроцедуры

Процедура ЗаписатьЛогВЖРПередВыполнениемСценария(ИмяСценария)
	ЗаписьЖурналаРегистрации("VanessaBehavior.ПередВыполнениемСценария",УровеньЖурналаРегистрации.Информация,,,ИмяСценария);
КонецПроцедуры



Процедура ВосстановитьНастройки()
	
	Если РежимСамотестирования Тогда
		Возврат;
	КонецЕсли;	 
	
	Настройки = ХранилищеОбщихНастроек.Загрузить("VanessaBehavior");
	Если ТипЗнч(Настройки) = Тип("Структура") Тогда
		
		Настройки.Свойство("DebugLog", DebugLog);
		//Настройки.Свойство("GenerateEpf", GenerateEpf);
		//Настройки.Свойство("TestRun", TestRun);
		Настройки.Свойство("ГенерироватьУФ", ГенерироватьУФ);
		//Настройки.Свойство("КаталогИнструментов", КаталогИнструментов);
		Настройки.Свойство("КаталогФич", КаталогФич);
		Настройки.Свойство("ДелатьОтчетВФорматеАллюр", ДелатьОтчетВФорматеАллюр);
		Настройки.Свойство("КаталогOutputAllure", КаталогOutputAllure);
		Настройки.Свойство("КаталогиБиблиотек", КаталогиБиблиотек);
		Настройки.Свойство("СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур", СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур);
		
		Настройки.Свойство("СписокТеговИсключение", СписокТеговИсключение);
		Настройки.Свойство("СписокТеговОтбор", СписокТеговОтбор);
		
		Настройки.Свойство("ДелатьЛогВыполненияСценариевВЖР", ДелатьЛогВыполненияСценариевВЖР);
		
		Если Настройки.Свойство("ВыполнятьШагиАссинхронно") Тогда
			Настройки.Свойство("ВыполнятьШагиАссинхронно", ВыполнятьШагиАссинхронно);
		КонецЕсли;	 
		
	КонецЕсли;
	
	//Элементы.DebugLog.Пометка = Объект.DebugLog;
	//Элементы.GenerateEpf.Пометка = Объект.GenerateEpf;
	//Элементы.TestRun.Пометка = Объект.TestRun;
КонецПроцедуры
 
Процедура СохранитьНастройки()
	Если РежимСамотестирования Тогда
		Возврат;
	КонецЕсли;	 
	
	Настройки = Новый Структура;
	Настройки.Вставить("DebugLog", DebugLog);
	//Настройки.Вставить("GenerateEpf", Объект.GenerateEpf);
	//Настройки.Вставить("TestRun", Объект.TestRun);
	Настройки.Вставить("ГенерироватьУФ", ГенерироватьУФ);
	//Настройки.Вставить("КаталогИнструментов", КаталогИнструментов);
	Настройки.Вставить("КаталогФич", КаталогФич);
	Настройки.Вставить("ДелатьОтчетВФорматеАллюр", ДелатьОтчетВФорматеАллюр);
	Настройки.Вставить("КаталогOutputAllure", КаталогOutputAllure);
	Настройки.Вставить("КаталогиБиблиотек", КаталогиБиблиотек);
	Настройки.Вставить("СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур", СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур);
	
	Настройки.Вставить("СписокТеговИсключение", СписокТеговИсключение);
	Настройки.Вставить("СписокТеговОтбор", СписокТеговОтбор);
	
	Настройки.Вставить("ДелатьЛогВыполненияСценариевВЖР", ДелатьЛогВыполненияСценариевВЖР);
	
	Настройки.Вставить("ВыполнятьШагиАссинхронно", ВыполнятьШагиАссинхронно);
	
	ХранилищеОбщихНастроек.Сохранить("VanessaBehavior",, Настройки);
КонецПроцедуры



Процедура ЗаполнитьКаталогИнструментовЕслиОнПустой()
	Если СокрЛП(КаталогИнструментов) = "" Тогда
		Файл = Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);
		КаталогИнструментов = Файл.Путь;
		Если Прав(КаталогИнструментов,1) = "\" Тогда
			КаталогИнструментов = Лев(КаталогИнструментов,СтрДлина(КаталогИнструментов)-1);
		КонецЕсли;	 
	КонецЕсли;	 
КонецПроцедуры

 
Процедура ПриОткрытии()
	ВыполнятьШагиАссинхронно = Истина;
	ВосстановитьНастройки();
	ОбъектКонтекстСохраняемый = Новый Структура;
	
	ЗаполнитьКаталогИнструментовЕслиОнПустой();
	
	ИнтервалВыполненияШага = 0.1;
	
	ВыполнятьШагиАссинхронно = Истина;
	
	ОбновитьКнопкуЗагрузитьФичи();
	
	ЭтаФорма.Заголовок = ПолучитьВерсиюОбработки();
	
	ЗапускВРежимеКоманднойСтроки();
	
	Если Не ЗапускИзКоманднойСтроки Тогда
		Если СокрЛП(КаталогФич) <> "" Тогда
			ЗагрузитьФичи();
		КонецЕсли;	 
	КонецЕсли;	 
	
	//СтрутктураJSON = ПрочитатьСтруктуруИзJSONФайла("H:\Commons\Temp\VBParams.json");
	
	
КонецПроцедуры


Функция ПолучитьСтруктуруПараметров(Стр)
	Результат = Новый Структура;
	
	Массив = РазложитьСтрокуВМассивПодстрок(Стр,";");
	Для каждого Элем Из Массив Цикл
		Поз = Найти(Элем,"=");
		Если Поз > 0 Тогда
			Ключ     = Лев(Элем,Поз-1);
			Значение = Сред(Элем,Поз+1);
			Результат.Вставить(Ключ,Значение);
		Иначе	
			Результат.Вставить(Элем,Истина);
		КонецЕсли;	 
	КонецЦикла;
	
	Возврат Результат;
КонецФункции	

Функция ПолучитьЗначениеПереданногоПараметра(СтруктураПараметров,ИмяПараметра)
	Если СтруктураПараметров.Свойство(ИмяПараметра) Тогда
		Возврат СтруктураПараметров[ИмяПараметра];
	Иначе	
		Возврат Неопределено;
	КонецЕсли;	 
КонецФункции	

Процедура ОчиститьСодержимоеКаталога(Знач ИмяКаталога)
	ФайлПроверкаСуществования = Новый Файл(ИмяКаталога);
	Если НЕ ФайлПроверкаСуществования.Существует() Тогда
		Возврат;
	КонецЕсли;	 
	
	Если Прав(ИмяКаталога,1) = "\" Тогда
		ИмяКаталога = Лев(ИмяКаталога,СтрДлина(ИмяКаталога)-1);
	КонецЕсли;	 
	
	МассивФайлов = НайтиФайлы(ИмяКаталога,"*.*",Ложь);
	Для каждого Файл Из МассивФайлов Цикл
		Если Файл.Существует() Тогда
			Попытка
				УдалитьФайлы(Файл.ПолноеИмя);
			Исключение
				СделатьСообщение("Не смог удалить файл!!! " + Файл.ПолноеИмя);
			КонецПопытки;
		КонецЕсли;	 
	КонецЦикла;
	
	

КонецПроцедуры



Процедура ЗапускВРежимеКоманднойСтроки()
	Если РежимСамотестирования Тогда
		Возврат;
	КонецЕсли;	 
	
	СтрЗапуска = СокрЛП(ПараметрЗапуска);
	Если СтрЗапуска = "" Тогда
		Возврат;
	КонецЕсли;	
	
	СтруктураПараметров = ПолучитьСтруктуруПараметров(СтрЗапуска);
	
	
	ПреобразоватьПараметрыКоторыеНачинаютсяСТочкиКНормальнымПутям(СтруктураПараметров);
	
	
	
	StartFeaturePlayer = ПолучитьЗначениеПереданногоПараметра(СтруктураПараметров,"StartFeaturePlayer");
	Если StartFeaturePlayer = Истина Тогда
		ЗапускИзКоманднойСтроки = Истина;
		
		VBParams = ПолучитьЗначениеПереданногоПараметра(СтруктураПараметров,"VBParams");
		Если VBParams = Неопределено Тогда
			СделатьСообщение("Не найден путь к файлу JSON. Параметр: VBParams.");
			Возврат;
		КонецЕсли;	 
		
		
		СтрутктураJSON = ПрочитатьСтруктуруИзJSONФайла(VBParams);
		Если СтрутктураJSON = Неопределено Тогда
			СделатьСообщение("Ошибка чтения структуры JSON.");
			Возврат;
		КонецЕсли;
		ПреобразоватьПараметрыКоторыеНачинаютсяСТочкиКНормальнымПутям(СтрутктураJSON);
		
		ПромСтр = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"КаталогФич");
		Если ПромСтр = Неопределено Тогда
			СделатьСообщение("В параметрах JSON не найден каталог Фич!");
			Возврат;
		КонецЕсли;	 
		
		КаталогФич = ПромСтр;
		
		СписокТеговИсключение.Очистить();
		ЗначСписокТеговИсключение = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"СписокТеговИсключение");
		Если ТипЗнч(ЗначСписокТеговИсключение) = Тип("Массив") Тогда
			СписокТеговИсключение.ЗагрузитьЗначения(ЗначСписокТеговИсключение);
		КонецЕсли;  
		
		
		СписокТеговОтбор.Очистить();
		ЗначСписокТеговОтбор = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"СписокТеговОтбор");
		Если ТипЗнч(ЗначСписокТеговОтбор) = Тип("Массив") Тогда
			СписокТеговОтбор.ЗагрузитьЗначения(ЗначСписокТеговОтбор);
		КонецЕсли;  
		
		
		ЗнДелатьСообщенияТранслитом = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ДелатьСообщенияТранслитом");
		Если ЗнДелатьСообщенияТранслитом = "Истина" Тогда
			ДелатьСообщенияТранслитом = Истина;
		КонецЕсли;	 
		
		
		
		
		ЗнДелатьОтчетВФорматеАллюр = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ДелатьОтчетВФорматеАллюр");
		Если ЗнДелатьОтчетВФорматеАллюр = "Истина" Тогда
			ОпределилиКаталогAllure = Ложь;
			
			ЗнКаталогOutputAllure = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"КаталогOutputAllure");
			Если ЗнКаталогOutputAllure <> Неопределено Тогда
				Файл = Новый Файл(ЗнКаталогOutputAllure);
				Если НЕ Файл.Существует() Тогда
					СделатьСообщение("В параметрах JSON передан несуществующий каталог для отчета КаталогOutputAllure!");
					Возврат;
				КонецЕсли;	 
				КаталогOutputAllure      = ЗнКаталогOutputAllure;
				ДелатьОтчетВФорматеАллюр = Истина;
				ОпределилиКаталогAllure  = Истина;
			КонецЕсли;	 
			
			
			ЗнДобавлятьКИмениСценарияУловияВыгрузки = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ДобавлятьКИмениСценарияУловияВыгрузки");
			Если ЗнДобавлятьКИмениСценарияУловияВыгрузки = "Истина" Тогда
				ДобавлятьКИмениСценарияУловияВыгрузки = Истина;
			КонецЕсли;	 
			
			
			
			ЗнВыгружатьСтатусВыполненияСценариевВФайл = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ВыгружатьСтатусВыполненияСценариевВФайл");
			Если ЗнВыгружатьСтатусВыполненияСценариевВФайл = "Истина" Тогда
				ВыгружатьСтатусВыполненияСценариевВФайл = Истина;
			КонецЕсли;	 
			
			ЗнПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев");
			Если ЗнПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев <> Неопределено Тогда
				ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев = ЗнПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев;
			КонецЕсли;	 
			
			ИмяТекущейСборки = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ИмяСборки");
			
			ЗнКаталогOutputAllureБазовый = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"КаталогOutputAllureБазовый");
			Если ЗнКаталогOutputAllureБазовый <> Неопределено Тогда
				Файл = Новый Файл(ЗнКаталогOutputAllureБазовый);
				Если НЕ Файл.Существует() Тогда
					СоздатьКаталог(Файл.ПолноеИмя);
					//СделатьСообщение("В параметрах JSON передан несуществующий каталог для отчета КаталогOutputAllureБазовый!");
					//Возврат;
				КонецЕсли;	 
				
				СисИнфо = Новый СистемнаяИнформация; 
				
				//ВерсияПриложения = СисИнфо.ВерсияПриложения;
				
				
				Если ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"СоздаватьПодкаталогВКаталогеAllureДляЭтойСборки") =  "Истина" Тогда
					ЗнКаталогOutputAllureБазовый = ЗнКаталогOutputAllureБазовый + "\" + ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ИмяСборки");
				КонецЕсли;	 
				
				ОчиститьСодержимоеКаталога(ЗнКаталогOutputAllureБазовый);
				ФайлПроверкаСуществования = Новый Файл(ЗнКаталогOutputAllureБазовый);
				Если НЕ ФайлПроверкаСуществования.Существует() Тогда
					СоздатьКаталог(ЗнКаталогOutputAllureБазовый);
					
					ФайлПроверкаСуществования = Новый Файл(ЗнКаталогOutputAllureБазовый);
					Если НЕ ФайлПроверкаСуществования.Существует() Тогда
						СделатьСообщение("Не смог создать каталог для отчета Allure: " + ЗнКаталогOutputAllureБазовый);
						Возврат;
					КонецЕсли;	 
				КонецЕсли;	 
				
				КаталогOutputAllure      = ЗнКаталогOutputAllureБазовый;
				ДелатьОтчетВФорматеАллюр = Истина;
				ОпределилиКаталогAllure  = Истина;
			КонецЕсли;	 
			
			Если НЕ ОпределилиКаталогAllure Тогда
				СделатьСообщение("Не смог из переданных параметров JSON определить каталог отчета Allure!");
				Возврат;
			КонецЕсли;	 
		КонецЕсли;	 
		
		ВыполнитьСценарии = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ВыполнитьСценарии");
		Если ВыполнитьСценарии = "Истина" Тогда
			ЗавершитьРаботуСистемы = ПолучитьЗначениеПереданногоПараметра(СтрутктураJSON,"ЗавершитьРаботуСистемы");
			Если ЗавершитьРаботуСистемы = "Истина" Тогда
				НадоЗавершитьРаботуСистемыПослеВыполненияВсехСценариев = Истина;
			КонецЕсли;	 
			
			ЗагрузитьФичи();
			ВыполнитьСценарии();
		КонецЕсли;	 
		
	КонецЕсли;	 
	
	
КонецПроцедуры
 
Процедура ПриСменеСтраницы(Элемент, ТекущаяСтраница)
	// Вставить содержимое обработчика.
	ЭлементыФормы.тпДеревоТестов.Видимость = Истина;
КонецПроцедуры
 
Процедура ДобавитьШагиВМассив(ДеревоСтроки,Шаги)
	Для каждого СтрДеревоСтроки Из ДеревоСтроки Цикл
		Если СтрДеревоСтроки.Примеры = Истина Тогда
			//эти сценарии уже учтены
			Продолжить;
		КонецЕсли; 
		
		Если СтрДеревоСтроки.Шаг = Истина Тогда
			СтруктураШага = Новый Структура;
			СтруктураШага.Вставить("Имя",СтрДеревоСтроки.Имя);
			СтруктураШага.Вставить("ИмяШагаБезКлючевогоСлова",СтрДеревоСтроки.ИмяШагаБезКлючевогоСлова);
			СтруктураШага.Вставить("АдресСнипета",СтрДеревоСтроки.АдресСнипета);
			СтруктураШага.Вставить("ШагСПараметрамиВТаблице",СтрДеревоСтроки.ШагСПараметрамиВТаблице);
			Шаги.Добавить(СтруктураШага);
		КонецЕсли;	 
		ДобавитьШагиВМассив(СтрДеревоСтроки.Строки,Шаги);
	КонецЦикла	
КонецПроцедуры
 
 
Процедура ДобавитьИменаФайловФичИзДереваВМассив(ДеревоСтроки,МассивФич,МассивШагов)
	Для каждого СтрДеревоСтроки Из ДеревоСтроки Цикл
		Если СтрДеревоСтроки.Фича = Истина Тогда
			МассивФич.Добавить(СтрДеревоСтроки.ПолныйПуть);
			Шаги = Новый Массив;
			ДобавитьШагиВМассив(СтрДеревоСтроки.Строки,Шаги);
			МассивШагов.Добавить(Шаги);
		КонецЕсли;	 
		ДобавитьИменаФайловФичИзДереваВМассив(СтрДеревоСтроки.Строки,МассивФич,МассивШагов);
	КонецЦикла;
КонецПроцедуры
 
 
Процедура ПолучитьСписокФичПоДереву(Дерево,МассивФич,МассивШагов)
	ДобавитьИменаФайловФичИзДереваВМассив(Дерево.Строки,МассивФич,МассивШагов);
КонецПроцедуры
 

Процедура СоздатьШаблоныОбработок() Экспорт
	Если Не РежимСамотестирования Тогда
		ОчиститьСообщения();
	КонецЕсли;  
	СделатьПараметрыКорректными();	
	
	ПарсерФич = ПолучитьИнструментПарсерФич();
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("КаталогИнструментов",КаталогИнструментов);
	СтруктураПараметров.Вставить("КаталогФич",КаталогФич);
	СтруктураПараметров.Вставить("DebugLog",DebugLog);
	СтруктураПараметров.Вставить("ГенерироватьУФ",ГенерироватьУФ);
	СтруктураПараметров.Вставить("СоздаватьОбластиПриГенерацииКода",СоздаватьОбластиПриГенерацииКода);
	СтруктураПараметров.Вставить("ШагСтрокДляМодуля",ШагСтрокДляМодуля);
	СтруктураПараметров.Вставить("КонтекстVanessaBehavoir",ЭтотОбъект);
	СтруктураПараметров.Вставить("КаталогиБиблиотек",КаталогиБиблиотек);
	СтруктураПараметров.Вставить("СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур",СоздаватьЗакоментированныйКодДляПереиспользуемыхПроцедур);
	
	СтруктураПараметров.Вставить("ТаблицаИзвестныхStepDefinition",ТаблицаИзвестныхStepDefinition);
	СтруктураПараметров.Вставить("ТаблицаВерсийEPF",ТаблицаВерсийEPF);
	СтруктураПараметров.Вставить("ТаблицаВерсийFeature",ТаблицаВерсийFeature);
	
	
	
	МассивФич   = Новый Массив;
	МассивШагов = Новый Массив;
	ПолучитьСписокФичПоДереву(ДеревоТестов,МассивФич,МассивШагов);
	СтруктураПараметров.Вставить("МассивФич",МассивФич);
	СтруктураПараметров.Вставить("МассивШагов",МассивШагов);
	
	
	ПарсерФич.СоздатьEPFПоМассивуФич(СтруктураПараметров);
	
	ЭтаФорма.Активизировать();

	
	//GenerateEpf = Истина;
	//TestRun     = Ложь;
	//ВыполнитьОбработку();
КонецПроцедуры



Процедура кнСоздатьШаблоныОбработокНажатие(Элемент)
	СоздатьШаблоныОбработок();
	
КонецПроцедуры
 
 
Функция ЭтоСценарий_SceanrioOutline(СтрокаДерева)
	Для каждого СтрСтроки Из СтрокаДерева.Строки Цикл
		Если СтрСтроки.Примеры = Истина Тогда
			Возврат Истина;
		КонецЕсли;	 
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции
 
 
 
 
Процедура ДобавитьСценарийАутлайн(СтрокаДерева,МассивСценариевДляВыполнения,ТекПример = Неопределено)
	//получим сами именнованные параметры
	
	ИменаПараметров = Неопределено;
	СтрокаПримеров  = Неопределено;
	Для каждого СтрСтроки Из СтрокаДерева.Строки Цикл
		Если СтрСтроки.Примеры = Истина Тогда
			ИменаПараметров = СтрСтроки.ИменованныеПараметры;
			СтрокаПримеров = СтрСтроки;
		КонецЕсли; 
	КонецЦикла;
	
	Если ИменаПараметров = Неопределено Тогда
		СтрОшибки = "Не смог найти у сценария " + СтрокаДерева.Имя + " имена изменяемых параметров!";
		СделатьСообщение(СтрОшибки);
		ВызватьИсключение СтрОшибки;
	КонецЕсли; 
	
	
	Ном = 0;
	Для каждого СтрСтрокаПримеров Из СтрокаПримеров.Строки Цикл
		Ном = Ном + 1;
		Если Ном = 1 Тогда
			//в первой строке лежат имена параметров
			Продолжить;
		КонецЕсли; 
		
		Если ТекПример <> Неопределено Тогда
			Если СтрСтрокаПримеров <> ТекПример Тогда
				Продолжить;
			КонецЕсли; 
		КонецЕсли; 
		
		СтруктураПараметровСценария = Новый Структура;
		СтруктураПараметровСценария.Вставить("Имя",СтрокаДерева.Имя + " (Пример №" + (Ном-1) + ")");
		СтруктураПараметровСценария.Вставить("СтрокаДерева",СтрСтрокаПримеров);
		
		
		Шаги = Новый Массив;
		
		Если СтрокаДерева.Родитель.Строки[0].ЭтоКонтекст = Истина Тогда //значит надо добавить шаги контекста к нашим шагам
			ДобавитьШагиДляВыполненияСценария(Шаги,СтрокаДерева.Родитель.Строки[0].Строки,СтрокаДерева,СтрСтрокаПримеров);
			//Для каждого СтрСтроки Из СтрокаДерева.Родитель.Строки[0].Строки Цикл
			//	СтруктураШага = ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрСтрокаПримеров);
			//	Шаги.Добавить(СтруктураШага);
			//КонецЦикла;
		КонецЕсли;	 
		
		
		ДобавитьШагиДляВыполненияСценария(Шаги,СтрСтрокаПримеров.Строки,СтрокаДерева,СтрСтроки.Родитель);
		//Для каждого СтрСтроки Из СтрСтрокаПримеров.Строки Цикл
		//	//Если СтрСтроки.Примеры = Истина Тогда
		//	//	Продолжить;
		//	//КонецЕсли; 
		//	
		//	СтруктураШага = ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрСтроки.Родитель);
		//	Шаги.Добавить(СтруктураШага);
		//КонецЦикла;
		
		СтруктураПараметровСценария.Вставить("Шаги",Шаги);
		
		
		
		
		МассивСценариевДляВыполнения.Добавить(СтруктураПараметровСценария);
	КонецЦикла;
	
	
	
	
	
	
	
	//Шаги = Новый Массив;
	//
	//Для каждого СтрСтроки Из СтрокаДерева.Строки Цикл
	//	СтруктураШага = Новый Структура;
	//	СтруктураШага.Вставить("Имя",СтрСтроки.Имя);
	//	СтруктураШага.Вставить("ЗначенияПараметров",СтрСтроки.ЗначенияПараметров);
	//	СтруктураШага.Вставить("АдресСнипета",СтрСтроки.АдресСнипета);
	//	СтруктураШага.Вставить("СтрокаРеальнойПроцедуры",СтрСтроки.СтрокаРеальнойПроцедуры);
	//	СтруктураШага.Вставить("Снипет",СтрСтроки.Снипет);
	//	СтруктураШага.Вставить("ИмяСценария",СтрокаДерева.Имя);
	//	СтруктураШага.Вставить("СтрокаШага",СтрСтроки);
	//	
	//	Шаги.Добавить(СтруктураШага);
	//КонецЦикла;
	//
	//
	//
	//СтруктураПараметров.Вставить("Шаги",Шаги);
	
	//МассивСценариевДляВыполнения.Добавить(СтруктураПараметров);
КонецПроцедуры


Функция ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрокаСценария)
	СтруктураШага = Новый Структура;
	СтруктураШага.Вставить("Имя",СтрСтроки.Имя);
	СтруктураШага.Вставить("ЗначенияПараметров",СтрСтроки.ЗначенияПараметров);
	СтруктураШага.Вставить("АдресСнипета",СтрСтроки.АдресСнипета);
	СтруктураШага.Вставить("СтрокаРеальнойПроцедуры",СтрСтроки.СтрокаРеальнойПроцедуры);
	СтруктураШага.Вставить("Снипет",СтрСтроки.Снипет);
	СтруктураШага.Вставить("ИмяСценария",СтрокаДерева.Имя);
	СтруктураШага.Вставить("СтрокаСценария",СтрокаСценария);
	СтруктураШага.Вставить("СтрокаШага",СтрСтроки);
	СтруктураШага.Вставить("ШагСчитаетсяУпавшим",Ложь);
	
	Возврат СтруктураШага;
КонецФункции

Процедура ДобавитьШагиДляВыполненияСценария(Шаги,ДеревоСтроки,СтрокаДерева,СтрокаСценария)
	Для каждого СтрСтроки Из ДеревоСтроки Цикл
		Если СтрСтроки.Шаг = Истина Тогда
			СтруктураШага = ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрокаДерева);
			Шаги.Добавить(СтруктураШага);
		ИначеЕсли СтрСтроки.ШагСценарий = Истина Тогда
			ДобавитьШагиДляВыполненияСценария(Шаги,СтрСтроки.Строки,СтрокаДерева,СтрокаСценария)
		ИначеЕсли СтрСтроки.Область = Истина Тогда
			ДобавитьШагиДляВыполненияСценария(Шаги,СтрСтроки.Строки,СтрокаДерева,СтрокаСценария)
		КонецЕсли;	 
	КонецЦикла;
КонецПроцедуры

Процедура ДобавитьОбычныйСценарий(СтрокаДерева,МассивСценариевДляВыполнения)
	Если СтрокаДерева.ЭтоКонтекст = Истина Тогда
		Возврат;
	КонецЕсли;	 
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("Имя",СтрокаДерева.Имя);
	СтруктураПараметров.Вставить("СтрокаДерева",СтрокаДерева);
	
	
	Шаги = Новый Массив;
	
	Если СтрокаДерева.Родитель.Строки[0].ЭтоКонтекст = Истина Тогда //значит надо добавить шаги контекста к нашим шагам
		ДобавитьШагиДляВыполненияСценария(Шаги,СтрокаДерева.Родитель.Строки[0].Строки,СтрокаДерева,СтрокаДерева);
		//Для каждого СтрСтроки Из СтрокаДерева.Родитель.Строки[0].Строки Цикл
		//	СтруктураШага = ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрокаДерева);
		//	Шаги.Добавить(СтруктураШага);
		//КонецЦикла;
	КонецЕсли;	 
	
	
	
	ДобавитьШагиДляВыполненияСценария(Шаги,СтрокаДерева.Строки,СтрокаДерева,СтрокаДерева);
	//Для каждого СтрСтроки Из СтрокаДерева.Строки Цикл
	//	Если СтрСтроки.Шаг = Истина Тогда
	//		СтруктураШага = ПолучитьСтруктуруШага(СтрСтроки,СтрокаДерева,СтрокаДерева);
	//		Шаги.Добавить(СтруктураШага);
	//	ИначеЕсли СтрСтроки.ШагСценарий = Истина Тогда
	//	КонецЕсли;	 
	//КонецЦикла;
	
	
	
	СтруктураПараметров.Вставить("Шаги",Шаги);
	
	МассивСценариевДляВыполнения.Добавить(СтруктураПараметров);
	
КонецПроцедуры
 
 
Процедура ДобавитьСценарийВМассивСценариевДляВыполнения(СтрокаДерева,МассивСценариевДляВыполнения)
	
	ЭтоСценариоАутлайн = ЭтоСценарий_SceanrioOutline(СтрокаДерева);
	Если ЭтоСценариоАутлайн Тогда
		//СделатьСообщение("Запуск СценариоАутлайн пока не реализован. " + СтрокаДерева.Имя);
		ДобавитьСценарийАутлайн(СтрокаДерева,МассивСценариевДляВыполнения);
		Возврат;
	КонецЕсли;	 
	
	//Сообщить(СтрокаДерева.Имя);
	
	ДобавитьОбычныйСценарий(СтрокаДерева,МассивСценариевДляВыполнения);
КонецПроцедуры
 
 
Процедура ДобавитьСценарииРекурсивно_ВМассивСценариевДляВыполнения(ДеревоСтроки,МассивСценариевДляВыполнения)
	Если ТипЗнч(ДеревоСтроки) = Тип("СтрокаДереваЗначений") Тогда
		Если ДеревоСтроки.Сценарий = Истина Тогда
			ДобавитьСценарийВМассивСценариевДляВыполнения(ДеревоСтроки,МассивСценариевДляВыполнения);
		ИначеЕсли ДеревоСтроки.Пример = Истина Тогда
			ДобавитьСценарийАутлайн(ДеревоСтроки.Родитель.Родитель,МассивСценариевДляВыполнения,ДеревоСтроки)
		КонецЕсли; 
	Иначе	
		Для каждого СтрДеревоСтроки Из ДеревоСтроки Цикл
			Если СтрДеревоСтроки.Сценарий = Истина Тогда
				ДобавитьСценарийВМассивСценариевДляВыполнения(СтрДеревоСтроки,МассивСценариевДляВыполнения);
			Иначе	
				ДобавитьСценарииРекурсивно_ВМассивСценариевДляВыполнения(СтрДеревоСтроки.Строки,МассивСценариевДляВыполнения);
			КонецЕсли;	 
		КонецЦикла;
	КонецЕсли; 
КонецПроцедуры
 
Функция СформироватьОписаниеОшибки(Знач Стр,ИмяФайла,ИмяПроцедуры) Экспорт
	Стр = СтрЗаменить(Стр,Символы.ПС,"");
	Стр = СтрЗаменить(Стр,Символы.ВК,"");
	
	//СтрПоиска = "Рефлектор.ВызватьМетод(СтрТабицаКонтекстовОбработок.Обработка, ИмяПроцедуры, МассивАргументов);";
	//Поз = Найти(Стр,СтрПоиска);
	//Если Поз > 0 Тогда
	//	ПромСтр = Сред(Стр,Поз + СтрДлина(СтрПоиска));
	//	Если ПромСтр <> "" Тогда
	//		Стр = ПромСтр;
	//	КонецЕсли;
	//КонецЕсли;
	//
	//Поз1 = Найти(Стр,"Метод объекта не обнаружен");
	//Если Поз1 > 0 Тогда
	//	Стр = Сред(Стр,Поз1);
	//	Поз2 = Найти(Стр,")");
	//	Стр = Лев(Стр,Поз2);
	//КонецЕсли;
	////Стр = СтрЗаменить(Стр,СтрПоиска,"");
	
	Стр = Стр + "; ИмяФайла="+ИмяФайла + ", ИмяПроцедуры="+ИмяПроцедуры;
	//Возврат ПерекодировкаДляОтправкиОшибки(Стр);
	Возврат Стр;
КонецФункции
 
 
Функция ПреобразоватьКДатеСтроку(Знач Стр) 
	НачСтр = Стр;
	//Зн = Дата(Стр);
	Год   = 0;
	Месяц = 0;
	День  = 0;
	
	Поз  = Найти(Стр,".");
	День = Число(Лев(Стр,Поз-1));
	Стр = Сред(Стр,Поз+1);
	
	Поз   = Найти(Стр,".");
	Месяц = Число(Лев(Стр,Поз-1));
	Стр   = Сред(Стр,Поз+1);
	
	Год   = Число(Стр);
	Если Год < 100 Тогда
		Год = Год + 2000;
	КонецЕсли;
	
	Зн = Дата(Год,Месяц,День);
	
	Зн = Формат(Зн,"ДФ=yyyyMMdd");
	Зн = "'" + Зн + "'";
	
	//Сообщить("" + НачСтр + " было преобразовано к " + Зн);
	Возврат Зн;
КонецФункции

Функция ПолучитьКонтекстТестаПоАдресСнипета(АдресСнипета)
	ИД = МассивИменКонтекстовОбработок.Найти(АдресСнипета);
	Если ИД = Неопределено Тогда
		Попытка
			ОбработкаТеста = ВнешниеОбработки.Создать(АдресСнипета);
			ОбработкаТеста.ПолучитьСписокТестов(ЭтотОбъект);//чтобы передать контекст vanessa-behavoir внутрь теста
		Исключение
			//Скорее всего это обработка не содержащая в себе тесты.
			Возврат Неопределено;
		КонецПопытки;
		
		МассивИменКонтекстовОбработок.Добавить(АдресСнипета);
		МассивКонтекстовОбработок.Добавить(ОбработкаТеста);
	Иначе
		ОбработкаТеста = МассивКонтекстовОбработок[ИД];
	КонецЕсли;	 
	
	Возврат ОбработкаТеста;
КонецФункции	

Процедура ДействияПослеЗавершенияСценария(СтрокаСценария,БылаОшибка = Ложь,ОписаниеОшибки = Неопределено)
	ВызватьМетодСценарияЕслиОнЕсть(СтрокаСценария, "ПередОкончаниемСценария",,БылаОшибка,ОписаниеОшибки);
	
	Пока ТранзакцияАктивна() Цикл
		ОтменитьТранзакцию();
	КонецЦикла;
КонецПроцедуры

Процедура ЗапретитьВыполнениеШаговФорма() Экспорт
	ОстановитьВыполнениеШагов = Истина;
КонецПроцедуры

Процедура УстановитьТекущемуШагуФлагЧтоОнДолженСчитатьсяУпавшим()
	Если ТекИД_ШагаВМассиве >= 0 Тогда
		Шаги   = МассивСценариевДляВыполнения[ТекИД_ШагаВМассиве].Шаги;
		ТекШаг = Шаги[ТекИД_ШагаВМассиве];
		ТекШаг.Вставить("ШагСчитаетсяУпавшим",Истина);
	КонецЕсли;	 
КонецПроцедуры

Процедура ПродолжитьВыполнениеШаговФорма(ШагУпал = Ложь) Экспорт
	ОстановитьВыполнениеШагов = Ложь;
	
	Если ШагУпал Тогда
		УстановитьТекущемуШагуФлагЧтоОнДолженСчитатьсяУпавшим();
	КонецЕсли;	 
	
	
	Если ВсёЕщёИдётВыполнениеШагов Тогда
		Возврат;
	КонецЕсли;	 
	
	ПерейтиКВыполнениюСледующегоШага();
КонецПроцедуры

Процедура ПерейтиКВыполнениюСледующегоШага()
	Если ОстановитьВыполнениеШагов Тогда
		Возврат;
	КонецЕсли;	 
	
	Если (ТекИД_СценарияВМассиве >= 0) и (ТекИД_ШагаВМассиве >= 0) Тогда
		Шаги   = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].Шаги;
		ТекШаг = Шаги[ТекИД_ШагаВМассиве];
		
		Если ТекШаг.ШагСчитаетсяУпавшим Тогда
			
			
			СтрокаШага                         = ТекШаг.СтрокаШага;
			СтрокаСценария                     = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
			РезультатПрохожденияТестовСценария = СтрокаСценария.РезультатПрохожденияТестовСценария;
			РезультатПрохожденияТестовШагов    = РезультатПрохожденияТестовСценария.РезультатПрохожденияТестовШагов;
			
			СтрокаШага.Статус      = "Failed";
			СтрокаШага.ТипКартинки = 5;
			СтрокаСценария.Статус  = СтрокаШага.Статус;
			АдресСнипета           = ТекШаг.АдресСнипета;
			ИмяПроцедуры           = ТекШаг.СтрокаРеальнойПроцедуры;
			
			СделатьСообщение("Шаг (" + ТекШаг.Имя + ") не выполнен.");
			ОписаниеОшибки = СформироватьОписаниеОшибки(ОписаниеОшибки(),АдресСнипета,ИмяПроцедуры);
			СделатьСообщение(ОписаниеОшибки);
			
			РезультатПрохожденияШага = РезультатПрохожденияТестовШагов[РезультатПрохожденияТестовШагов.Количество()-1];
			
			
			РезультатПрохожденияТестовСценария.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
			РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
			РезультатПрохожденияШага.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
			РезультатПрохожденияШага.Вставить("ОписаниеОшибки",ОписаниеОшибки);
			РезультатПрохожденияШага.Вставить("Статус",СтрокаШага.Статус);
			
			СделатьСообщение(ОписаниеОшибки);
			
			РезультатПрохожденияТестовШагов.Добавить(РезультатПрохожденияШага);
			
			БылаОшибка     = Ложь;
			ОписаниеОшибки = "";
			ДействияПослеЗавершенияСценария(СтрокаСценария,БылаОшибка,ОписаниеОшибки);
			
			СтрокаСценария.Статус = "Failed";
			РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
			
			ТекИД_СценарияВМассиве = ТекИД_СценарияВМассиве + 1;
			//выполняем следующий сценарий
			ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
			
			Возврат;
		КонецЕсли;	 
	КонецЕсли;	 
	
	
	Если ТекИД_ШагаВМассиве = -1 Тогда
		ТекИД_ШагаВМассиве = ТекИД_ШагаВМассиве + 1;
	ИначеЕсли 	ТекИД_ШагаВМассиве = ТекИД_ВыполненногоШагаВМассиве Тогда // это надо т.к. в определенных случаях таймер, подключающий следующий шаг может не сработать
		ТекИД_ШагаВМассиве = ТекИД_ШагаВМассиве + 1;
	КонецЕсли;	 
	
	Если (НЕ ВыполнятьШагиАссинхронно) или ТранзакцияАктивна() Тогда //если транзакция активна, то нельзя использовать таймер
		ВыполнитьШаг();//просто вызываем следующий шаг
	Иначе
		ПодключитьОбработчикОжидания("ВыполнитьШаг",ИнтервалВыполненияШага,Истина); //вызвываем шаг через таймер, чтобы дать всем формам прорисоваться
	КонецЕсли;	 
КонецПроцедуры

Функция ПолучитьЗначениеДляПередачиВМетод(Значение,Тип)
	Если Тип = "Строка" Тогда
		Возврат """" + СтрЗаменить(Значение,"""","""""") + """";
	ИначеЕсли Тип = "Число" Тогда
		Возврат Значение;
	ИначеЕсли Тип = "Дата" Тогда
		Возврат ПреобразоватьКДатеСтроку(Значение);
	Иначе
		ВызватьИсключение "Неизвестный Тип: " + Тип + " в ПолучитьЗначениеДляПередачиВМетод";
	КонецЕсли;	 
КонецФункции


Функция ПолучитьМассивПараметровИзСписокАргументов(СписокАргументов)
	МассивПараметров = Новый Массив;
	Для Каждого ЭлементМассива Из СписокАргументов Цикл
		Элем = ЭлементМассива.Значение;
		МассивПараметров.Добавить(ПолучитьЗначениеДляПередачиВМетод(Элем.Значение,Элем.Тип));
	КонецЦикла;
	
	Возврат МассивПараметров;
КонецФункции	

Процедура ПодготовитьИВызватьМетод(ТекШаг,ОбработкаТеста,ИмяПроцедуры,МассивПараметров)
	ОбработкаТеста.Контекст            = ОбъектКонтекст;
	ОбработкаТеста.КонтекстСохраняемый = ОбъектКонтекстСохраняемый;
	
	Если ДелатьЛогВыполненияСценариевВЖР Тогда
		ЗаписатьЛогВЖРПередВыполнениемШага(ТекШаг.Имя);
	КонецЕсли;	 
	
	ВсёЕщёИдётВыполнениеШагов = Истина;
	ВызватьМетод(ОбработкаТеста, ИмяПроцедуры, МассивПараметров);
	ВсёЕщёИдётВыполнениеШагов = Ложь;
	
	ОбъектКонтекст            = ОбработкаТеста.Контекст;
	ОбъектКонтекстСохраняемый = ОбработкаТеста.КонтекстСохраняемый;
КонецПроцедуры

Процедура ВыполнитьШаг()
	ТекИД_ВыполненногоШагаВМассиве = ТекИД_ШагаВМассиве;
	
	Шаги = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].Шаги;
	Если (Шаги.Количество()-1) < ТекИД_ШагаВМассиве Тогда
		//значит все шаги выполнены, запускаем следующий сценарий
		//МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
		
		СтрокаСценария                     = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
		
		БылаОшибка     = Ложь;
		ОписаниеОшибки = "";
		ДействияПослеЗавершенияСценария(СтрокаСценария,БылаОшибка,ОписаниеОшибки);
		
		РезультатПрохожденияТестовСценария = СтрокаСценария.РезультатПрохожденияТестовСценария;
		РезультатПрохожденияТестовСценария.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		
		
		Если БылаОшибка Тогда
			СтрокаСценария.Статус = "Failed";
			РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
		КонецЕсли;	 
		
		
		ТекИД_СценарияВМассиве = ТекИД_СценарияВМассиве + 1;
		ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
		Возврат;
	КонецЕсли;	 
	
	ТекШаг = Шаги[ТекИД_ШагаВМассиве];
	//ТекШаг.СтрокаШага.ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ЭлементыФормы.тпДеревоТестов.ТекущаяСтрока = ТекШаг.СтрокаШага;
	
	СтрокаШага                         = ТекШаг.СтрокаШага;
	СтрокаСценария                     = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
	РезультатПрохожденияТестовСценария = СтрокаСценария.РезультатПрохожденияТестовСценария;
	РезультатПрохожденияТестовШагов    = РезультатПрохожденияТестовСценария.РезультатПрохожденияТестовШагов;
	
	РезультатПрохожденияШага = Новый Структура;
	РезультатПрохожденияШага.Вставить("Имя",СтрокаШага.Имя);
	РезультатПрохожденияШага.Вставить("ВремяНачала",ТекущаяУниверсальнаяДатаВМиллисекундах());
	
	
	АдресСнипета = ТекШаг.АдресСнипета;
	Если СокрЛП(АдресСнипета) = "" Тогда
		//МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
		
		//СтрокаШага.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		СтрокаШага.Статус = "Pending";
		ОписаниеОшибки = "Не реализован. Пустой адрес снипета у шага: " + ТекШаг.Имя;
		//СтрокаШага.ОписаниеОшибки = ОписаниеОшибки;
		
		//СтрокаСценария.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		//СтрокаСценария.ОписаниеОшибки = ОписаниеОшибки;
		РезультатПрохожденияТестовСценария.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
		СтрокаСценария.Статус         = СтрокаШага.Статус;
		
		РезультатПрохожденияШага.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияШага.Вставить("ОписаниеОшибки",ОписаниеОшибки);
		РезультатПрохожденияШага.Вставить("Статус",СтрокаШага.Статус);
		
		СделатьСообщение(ОписаниеОшибки);
		
		
		РезультатПрохожденияТестовШагов.Добавить(РезультатПрохожденияШага);
		
		ДействияПослеЗавершенияСценария(СтрокаСценария);
		
		ТекИД_СценарияВМассиве = ТекИД_СценарияВМассиве + 1;
		//выполняем следующий сценарий
		ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
		
		Возврат;
	КонецЕсли;	 
	
	
	
	ОбработкаТеста = ПолучитьКонтекстТестаПоАдресСнипета(АдресСнипета);
	
	ИмяПроцедуры     = ТекШаг.СтрокаРеальнойПроцедуры;
	СписокАргументов = ТекШаг.ЗначенияПараметров;
	
	
	МассивПараметров = ПолучитьМассивПараметровИзСписокАргументов(СписокАргументов);
	
	
	
	Если СтрокаШага.ШагСПараметрамиВТаблице = Истина Тогда
		ПарамТаблица = Новый Массив;
		Для каждого СтрокиТаблицы Из СтрокаШага.Строки Цикл
			СтрокаПарамТаблица = Новый Структура;
			
			НомерКолонки = 0;
			Для каждого Колонка Из СтрокиТаблицы.ПараметрыТаблицы Цикл
				НомерКолонки       = НомерКолонки + 1;
				СтруктураПараметра = Колонка.Значение;
				Значение           = ПолучитьЗначениеДляПередачиВМетод(СтруктураПараметра.Значение,СтруктураПараметра.Тип);
				Значение           = Вычислить(Значение);
			
				СтрокаПарамТаблица.Вставить("Кол" + НомерКолонки,Значение);
			КонецЦикла;
			
			ПарамТаблица.Добавить(СтрокаПарамТаблица);
		КонецЦикла;
		МассивПараметров.Добавить(ПарамТаблица);
	КонецЕсли;	 
	
	
	СтрОшибка       = Неопределено;
	ШагВыполнен     = Ложь;
	ШагНеРеализован = Ложь;
	Попытка
		ПодготовитьИВызватьМетод(ТекШаг,ОбработкаТеста,ИмяПроцедуры,МассивПараметров);
		
		
		ШагВыполнен = Истина;
	Исключение
		Отладка("ОписаниеОшибки()="+ОписаниеОшибки());
		ОписаниеОшибкиСтр = ОписаниеОшибки();
		Если Найти(ОписаниеОшибкиСтр,"}: Не реализовано.") > 0 Тогда //тогда это Pending
			СделатьСообщение("Шаг (" + ТекШаг.Имя + ") не реализован.");
			СтрОшибка = "Не реализовано.";
			ШагНеРеализован = Истина;
		Иначе
			//значит возникла ошибка
			СделатьСообщение("Шаг (" + ТекШаг.Имя + ") не выполнен.");
			СтрОшибка = СформироватьОписаниеОшибки(ОписаниеОшибки(),АдресСнипета,ИмяПроцедуры);
			СделатьСообщение(СтрОшибка);
		КонецЕсли;
	КонецПопытки;
	
	
	СтрокаШага = ТекШаг.СтрокаШага;	
	//СтрокаШага.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
	РезультатПрохожденияШага.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
	
	
	Если ШагВыполнен Тогда
		СтрокаШага.Статус = "Success";
		РезультатПрохожденияТестовШагов.Добавить(РезультатПрохожденияШага);
		
		РезультатПрохожденияШага.Вставить("Статус",СтрокаШага.Статус);
		
		ПерейтиКВыполнениюСледующегоШага();
	Иначе	
		Если ШагНеРеализован Тогда
			СтрокаШага.Статус = "Pending";
		Иначе
			СтрокаШага.Статус = "Failed";
			
			СтатусЗапускаСценариев = Ложь;
		КонецЕсли; 
		//СтрокаШага.ОписаниеОшибки = СтрОшибка;
		РезультатПрохожденияШага.Вставить("ОписаниеОшибки",СтрОшибка);
		РезультатПрохожденияШага.Вставить("Статус",СтрокаШага.Статус);
		
		СтрокаСценария                = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
		//СтрокаСценария.ВремяОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах();
		//СтрокаСценария.ОписаниеОшибки = СтрОшибка;
		РезультатПрохожденияТестовСценария.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",СтрОшибка);
		
		СтрокаСценария.Статус         = СтрокаШага.Статус;
		
		БылаОшибка     = Ложь;
		ОписаниеОшибки = "";
		ДействияПослеЗавершенияСценария(СтрокаСценария,БылаОшибка,ОписаниеОшибки);
		
		РезультатПрохожденияТестовШагов.Добавить(РезультатПрохожденияШага);
		
		Если БылаОшибка Тогда
			СтрокаСценария.Статус = "Failed";
			РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
		КонецЕсли;
		
		
		ДобавитьШагиВРезультатПрохожденияТестовШаговКоторыеНеВыполнялись(Шаги,ТекИД_ШагаВМассиве,РезультатПрохожденияТестовШагов);
		
		
		
		ТекИД_СценарияВМассиве = ТекИД_СценарияВМассиве + 1;
		//выполняем следующий сценарий
		ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
	КонецЕсли;
	
	
	
КонецПроцедуры


Процедура ДобавитьШагиВРезультатПрохожденияТестовШаговКоторыеНеВыполнялись(Шаги,ТекИД,РезультатПрохожденияТестовШагов)
	Ид = ТекИД;
	Пока Истина Цикл
		Ид = Ид+1;
		Если Шаги.Количество() < (Ид+1) Тогда
			Прервать;
		КонецЕсли;	 
		
		ТекШаг = Шаги[Ид];
		
		РезультатПрохожденияШага = Новый Структура;
		РезультатПрохожденияШага.Вставить("Имя",ТекШаг.Имя);
		РезультатПрохожденияШага.Вставить("ВремяНачала",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияШага.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияШага.Вставить("ОписаниеОшибки","Пропущен");
		РезультатПрохожденияШага.Вставить("Статус","Skipped");
		
		РезультатПрохожденияТестовШагов.Добавить(РезультатПрохожденияШага);
		
	КонецЦикла;
КонецПроцедуры

 
Процедура ОбработатьСтатусСценария(ИД)
	СтрокаСценария = МассивСценариевДляВыполнения[ИД].СтрокаДерева;
	
	Если СокрЛП(СтрокаСценария.Статус) <> "" Тогда
		Возврат;
	КонецЕсли;	 
	
	РезультатПрохожденияТестовШагов = СтрокаСценария.РезультатПрохожденияТестовСценария.РезультатПрохожденияТестовШагов;
	
	СценарийВыполнен = Истина;
	Для каждого СтрШаг Из РезультатПрохожденияТестовШагов Цикл
		Если СтрШаг.Статус <> "Success" Тогда
			СценарийВыполнен = Ложь;
			Статус = СтрШаг.Статус;
			//СтрокаСценария.ОписаниеОшибки = СтрШаг.ОписаниеОшибки;
			Прервать;
		КонецЕсли; 
	КонецЦикла;
	
	Если СценарийВыполнен Тогда
		//ЭлементыФормы.тпДеревоТестов.Свернуть(СтрокаСценария); 
		СтрокаСценария.Статус = "Success";
	Иначе	
		СтрокаСценария.Статус = Статус;
	КонецЕсли; 
КонецПроцедуры



Функция ОпределитьИмяФичаФайлаПоСтрокеДерева(СтрокаДерева)
	Если СтрокаДерева.Фича = Истина Тогда
		Возврат СтрокаДерева.ПолныйПуть;
	КонецЕсли;	 
	
	Возврат ОпределитьИмяФичаФайлаПоСтрокеДерева(СтрокаДерева.Родитель);
КонецФункции	

Процедура ВызватьМетодСценарияЕслиОнЕсть(СтрокаДереваСценария, ИмяПроцедуры,МассивПараметров = Неопределено,БылаОшибка = Ложь,ОписаниеОшибки = Неопределено)
	ИмяФичаФайла = ОпределитьИмяФичаФайлаПоСтрокеДерева(СтрокаДереваСценария);
	Если ИмяФичаФайла = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	Файл         = Новый Файл(ИмяФичаФайла);
	КаталогФичи  = Файл.Путь;
	АдресСнипета = КаталогФичи + "step_definitions\" + Файл.ИмяБезРасширения + ".epf";
	
	
	ФайлПроверкаСуществования = Новый Файл(АдресСнипета);
	Если НЕ ФайлПроверкаСуществования.Существует() Тогда
		Возврат;
	КонецЕсли;	 
	
	ОбработкаТеста = ПолучитьКонтекстТестаПоАдресСнипета(АдресСнипета);
	Если ОбработкаТеста = Неопределено Тогда
		//это возможно, если у фичи вообще нет своей обработки и она использует только шаги из других фич
		Возврат;
	КонецЕсли;  
	
	ОбработкаТеста.Контекст            = ОбъектКонтекст;
	ОбработкаТеста.КонтекстСохраняемый = ОбъектКонтекстСохраняемый;
	
	Попытка
		ВызватьМетод(ОбработкаТеста, ИмяПроцедуры, МассивПараметров);
	Исключение
		СделатьСообщение("Ошибка в " + ИмяПроцедуры + ". " + ОписаниеОшибки());
		ОписаниеОшибки = ОписаниеОшибки();
		БылаОшибка     = Истина;
	КонецПопытки;
	
	ОбъектКонтекст            = ОбработкаТеста.Контекст;
	ОбъектКонтекстСохраняемый = ОбработкаТеста.КонтекстСохраняемый;
КонецПроцедуры

Процедура ВыгрузитьСтатусВыполненияСценариевВФайл(Статус,ПутьКФайлу)
	Файл = Новый Файл(ПутьКФайлу);
	
	Если Файл.Существует() Тогда
		Если Файл.ЭтоКаталог() Тогда
			СделатьСообщение("Не могу выгрузить статус сценариев, т.к. был передан каталог, а не файл.");
			Возврат;
		КонецЕсли;	
	КонецЕсли;	 
	
	
	ФайлКаталог = Новый Файл(Файл.Путь);
	Если НЕ ФайлКаталог.Существует() Тогда
		СделатьСообщение("Не могу выгрузить статус сценариев, т.к. каталог " + ФайлКаталог.ПолноеИмя + " не существует!");
		Возврат;
	КонецЕсли;	
	
	
	УдалитьФайлы(ПутьКФайлу);
	
	ЗТ = Новый ЗаписьТекста(ПутьКФайлу,"UTF-8",,Истина); 
	Если Статус Тогда
		Стр = "0";
	Иначе	
		Стр = "1";
	КонецЕсли;	 
	
	ЗТ.ЗаписатьСтроку(Стр); 
	
	ЗТ.Закрыть();
	
	СделатьСообщение("Записал файл статуса сборки: " + ПутьКФайлу);
КонецПроцедуры


Функция ПолучитьОбработкаСвязаннаяСИсполняемойФичей(ИмяФайлаФичи)
	ЭтоLinux = Ложь;
	ФайлФичи = Новый Файл(ИмяФайлаФичи);
	ФайлEPF  = ФайлФичи.Путь + "step_definitions" +?(ЭтоLinux, "/", "\") + ФайлФичи.ИмяБезРасширения + ".epf";
	Файл = Новый Файл(ФайлEPF);
	
	Если НЕ Файл.Существует() Тогда
		Возврат Неопределено;
	КонецЕсли; 
	
	Возврат ПолучитьКонтекстТестаПоАдресСнипета(ФайлEPF);
КонецФункции

Функция НайтиСтрокуФичиЧерезРодителя(Стр)
	СтрокаДерева = Стр;
	Пока Истина Цикл
		СтрокаДерева = СтрокаДерева.Родитель;
		Если СтрокаДерева = Неопределено Тогда
			Возврат Неопределено;
		КонецЕсли;	 
		
		Если СтрокаДерева.Фича = Истина Тогда
			Возврат СтрокаДерева;
		КонецЕсли;	 
	КонецЦикла;
КонецФункции	


Процедура ВыполнинтьСценарийАссинхронноТаймер()
	ОбъектКонтекст = Новый Структура;
	
	Если ТекИД_СценарияВМассиве > 0 Тогда
		ОбработатьСтатусСценария(ТекИД_СценарияВМассиве-1);
	КонецЕсли; 
	
	Если (МассивСценариевДляВыполнения.Количество()-1) < ТекИД_СценарияВМассиве Тогда
		Сообщить(" ");
		СделатьСообщение("Все сценарии обработаны!");
		
		
		Если ДелатьОтчетВФорматеАллюр Тогда
			СформироватьОтчетАллюр();
		КонецЕсли; 
		
		Если ВыгружатьСтатусВыполненияСценариевВФайл Тогда
			ВыгрузитьСтатусВыполненияСценариевВФайл(СтатусЗапускаСценариев,ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев);
		КонецЕсли;	 
		
		
		Если НадоЗавершитьРаботуСистемыПослеВыполненияВсехСценариев Тогда
			ЗавершитьРаботуСистемы(Ложь);
		КонецЕсли;	 
		
		Возврат;
	КонецЕсли;	 
	
	Сообщить(" ");
	СделатьСообщение("Работаю по сценарию: " + МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].Имя);
	
	Если ДелатьЛогВыполненияСценариевВЖР Тогда
		ЗаписатьЛогВЖРПередВыполнениемСценария(МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].Имя);
	КонецЕсли;	 
	
	//МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева.ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	
	СтрокаДерева = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
	СтрокаДерева.РезультатПрохожденияТестовСценария = Новый Структура;
	СтрокаДерева.РезультатПрохожденияТестовСценария.Вставить("ВремяНачала",ТекущаяУниверсальнаяДатаВМиллисекундах());
	РезультатПрохожденияТестовШагов = Новый Массив;
	СтрокаДерева.РезультатПрохожденияТестовСценария.Вставить("РезультатПрохожденияТестовШагов",РезультатПрохожденияТестовШагов);
	
	
	ЭлементыФормы.тпДеревоТестов.ТекущаяСтрока = СтрокаДерева;
	
	
	
	
	СтрокаФичи = НайтиСтрокуФичиЧерезРодителя(СтрокаДерева);
	ОбработкаСвязаннаяСИсполняемойФичей = ПолучитьОбработкаСвязаннаяСИсполняемойФичей(СтрокаФичи.ПолныйПуть);
	
	
	
	
	
	БылаОшибка = Ложь;
	ОписаниеОшибки = "";
	ВызватьМетодСценарияЕслиОнЕсть(СтрокаДерева, "ПередНачаломСценария",,БылаОшибка,ОписаниеОшибки);
	Если БылаОшибка Тогда
		СтрокаСценария = МассивСценариевДляВыполнения[ТекИД_СценарияВМассиве].СтрокаДерева;
		СтрокаСценария.Статус = "Failed";
		
		ДействияПослеЗавершенияСценария(СтрокаСценария);
		
		РезультатПрохожденияТестовСценария = СтрокаСценария.РезультатПрохожденияТестовСценария;
		РезультатПрохожденияТестовСценария.Вставить("ВремяОкончания",ТекущаяУниверсальнаяДатаВМиллисекундах());
		РезультатПрохожденияТестовСценария.Вставить("ОписаниеОшибки",ОписаниеОшибки);
		
		
		ТекИД_СценарияВМассиве = ТекИД_СценарияВМассиве + 1;
		ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
		Возврат;
	КонецЕсли;	 
	
	ТекИД_ШагаВМассиве             = -1;
	ТекИД_ВыполненногоШагаВМассиве = -1;
	ВсёЕщёИдётВыполнениеШагов      = Ложь;
	ПерейтиКВыполнениюСледующегоШага();
	
	
КонецПроцедуры
 

Процедура ОчиститьПоляВДеревеДляПостроенияОтчетов(Дерево)
	Для каждого СтрСтроки Из Дерево.Строки Цикл
		  СтрСтроки.РезультатПрохожденияТестовСценария = Неопределено;
		  СтрСтроки.Статус                             = "";
		//СтрСтроки.ВремяНачала    = Неопределено;
		//СтрСтроки.ВремяОкончания = Неопределено;
		//СтрСтроки.ОписаниеОшибки = Неопределено;
		
		ОчиститьПоляВДеревеДляПостроенияОтчетов(СтрСтроки);
	КонецЦикла;
КонецПроцедуры


Процедура ВыполнитьСценарии(ТекСценарий = Неопределено) Экспорт
	СделатьПараметрыКорректными();
	
	ОстановитьВыполнениеШагов = Ложь;
	СтатусЗапускаСценариев    = Истина;
	
	ОчиститьПоляВДеревеДляПостроенияОтчетов(ДеревоТестов);
	
	МассивКонтекстовОбработок     = Новый Массив;
	МассивИменКонтекстовОбработок = Новый Массив;
	
	МассивСценариевДляВыполнения = Новый Массив;
	
	Если ТекСценарий = Неопределено Тогда
		ТекСценарий = ДеревоТестов.Строки;
	КонецЕсли; 
	
	ДобавитьСценарииРекурсивно_ВМассивСценариевДляВыполнения(ТекСценарий,МассивСценариевДляВыполнения);
	
	
	
	Если ВыполнятьСценарииАсинхронно Тогда
		ТекИД_СценарияВМассиве = 0;
		ПодключитьОбработчикОжидания("ВыполнинтьСценарийАссинхронноТаймер",0.1,Истина);
	КонецЕсли;	 
	
	
	
	//ПарсерФич = ПолучитьИнструментПарсерФич();
	//
	//СтруктураПараметров = Новый Структура;
	//СтруктураПараметров.Вставить("КаталогИнструментов",КаталогИнструментов);
	//СтруктураПараметров.Вставить("КаталогФич",КаталогФич);
	//
	//МассивСообщений = Новый Массив;
	//СтруктураПараметров.Вставить("МассивСообщений",МассивСообщений);
	//СтруктураПараметров.Вставить("DebugLog",DebugLog);
	//
	//ДеревоФич = ПарсерФич.ВыполнитьСценарии(СтруктураПараметров);
	//
	//Для каждого Элем Из МассивСообщений Цикл
	//	Сообщить(Элем);
	//КонецЦикла;
	//
	//Если ДеревоФич = Неопределено Тогда
	//	Возврат;
	//КонецЕсли;	 
	//
	////ОбновитьСтатусы(ДеревоФич);
	////
	////РазврнутьДеревоДоСценариев(ДеревоТестов);
	////
	
	//СделатьСообщение("Сценарии выполнены.");
	//ПарсерФич.ВычислитьСнипетыДляШагов();
КонецПроцедуры
 
Процедура СделатьПараметрыКорректными()
	Если Прав(КаталогИнструментов,1) = "\" Тогда
		КаталогИнструментов = Лев(КаталогИнструментов,СтрДлина(КаталогИнструментов)-1);
	КонецЕсли; 
КонецПроцедуры
 
 
 
Процедура кнЗапуститьСценарииНажатие(Элемент)
	
	
	
	ОчиститьСообщения();
	
	ВыполнитьСценарии();
	
	//GenerateEpf = Ложь;
	//TestRun     = Истина;
	//ВыполнитьОбработку();
КонецПроцедуры
 
Процедура СкопироватьСтрокиДерева(ДеревоОткудаСтроки,ДеревоКудаСтроки)
	Для каждого СтрДеревоОткудаСтроки Из ДеревоОткудаСтроки Цикл
		СтрДеревоКудаСтроки = ДеревоКудаСтроки.Добавить();
		Если СтрДеревоОткудаСтроки.Строки.Количество() > 0 Тогда
			СкопироватьСтрокиДерева(СтрДеревоОткудаСтроки.Строки,СтрДеревоКудаСтроки.Строки)
		КонецЕсли;	 
		ЗаполнитьЗначенияСвойств(СтрДеревоКудаСтроки,СтрДеревоОткудаСтроки);
	КонецЦикла;
	
КонецПроцедуры
 
Процедура СкопироватьДеревоНаФорму(ДеревоФич)
	ДеревоТестов.Строки.Очистить();
	СкопироватьСтрокиДерева(ДеревоФич.Строки,ДеревоТестов.Строки);
	//ДеревоТестов = ДеревоФич.Скопировать();
	//ЭлементыФормы.тпДеревоТестов.СоздатьКолонки();
	//ДеревоТестов.Строки.ЗагрузитьКолонку(ДеревоФич.Строки.ВыгрузитьКолонку());
КонецПроцедуры
 
 
Функция ПолучитьИнструментПарсерФич()
	ПутьКФайлу = КаталогИнструментов + "\vbFeatureReader.epf";
	Файл = Новый Файл(ПутьКФайлу);
	Если Не Файл.Существует() Тогда
		СделатьСообщение("Файл " + ПутьКФайлу + " не найден!");
		Возврат Неопределено;
	КонецЕсли;	 
	ПарсерФич = ВнешниеОбработки.Создать(ПутьКФайлу);
	
	Возврат  ПарсерФич;
КонецФункции
 
 
Процедура РазврнутьДеревоДоСценариев(Дерево)
	Для каждого СтрСтроки Из Дерево.Строки Цикл
		Если (СтрСтроки.Каталог = Истина) или (СтрСтроки.Фича = Истина) Тогда
			ЭлементыФормы.тпДеревоТестов.Развернуть(СтрСтроки,Ложь);
		КонецЕсли;	 
		РазврнутьДеревоДоСценариев(СтрСтроки);
	КонецЦикла;
КонецПроцедуры
 

Процедура ПолучитьУжеСуществующиеСценарииИзФич(Знач КаталогФич,ДополнительныеПараметры = Неопределено,МассивОбработанныхФайлов)
	Файл = Новый Файл(КаталогФич);
	
	НачальныйКаталог = КаталогФич;
	КаталогПоиска    = НачальныйКаталог;
	
	Файл = Новый Файл(НачальныйКаталог);
	Если НРег(Файл.Расширение) = ".feature" Тогда
		КаталогПоиска = Файл.Путь;
	КонецЕсли;	 
	
	Отладка("Ищу сценарии в каталоге " + КаталогПоиска);
		
	//Сообщить("КаталогПоиска="+КаталогПоиска);
	МассивФайлов = НайтиФайлы(КаталогПоиска,"*.feature",Истина);
	
	Для Каждого Файл Из МассивФайлов Цикл
		ИмяФайла = Файл.ПолноеИмя;
		
		Зн = МассивОбработанныхФайлов.Найти(ИмяФайла);
		Если Зн <> Неопределено Тогда
			Продолжить;
		КонецЕсли;	 
		
		МассивОбработанныхФайлов.Добавить(ИмяФайла);
		
		//СтрТаблицаУжеСуществующихСценариев = ТаблицаУжеСуществующихСценариев.Найти(ИмяФайла,"ИмяФайла");
		//Если СтрТаблицаУжеСуществующихСценариев <> Неопределено Тогда
		//	Продолжить;
		//КонецЕсли;	 
		
		ВерсияФайла = Файл.ПолучитьВремяИзменения();
		
		
		СтрТаблицаВерсийFeature = ТаблицаВерсийFeature.Найти(ИмяФайла,"");
		Если СтрТаблицаВерсийFeature = Неопределено Тогда
			СтрТаблицаВерсийFeature             = ТаблицаВерсийFeature.Добавить();
			СтрТаблицаВерсийFeature.ИмяФайла    = ИмяФайла;
			СтрТаблицаВерсийFeature.ВерсияФайла = ВерсияФайла;
		Иначе	
			Если СтрТаблицаВерсийFeature.ВерсияФайла <> ВерсияФайла Тогда
				//значит файл изменился
				//обновляем версию и удаляем старые снипеты
				СтрТаблицаВерсийFeature.ВерсияФайла = ВерсияФайла;
				
				
				МассивИД = Новый Массив;
				Ном = -1;
				Для каждого Элем Из ТаблицаУжеСуществующихСценариев Цикл
					Ном = Ном + 1;
					Если Элем.ИмяФайла = ИмяФайла Тогда
						МассивИД.Добавить(Ном);
					КонецЕсли; 
				
				КонецЦикла;
				               
				Для Ккк = 0 По МассивИД.Количество()-1 Цикл
					ИД = МассивИД[МассивИД.Количество()-1 - Ккк];
					ТаблицаУжеСуществующихСценариев.Удалить(ИД);
				КонецЦикла;
					
			Иначе
				//значит уже актуальная версия файла загружена
				//Сообщить("!!!!!!!!!!!!!!!!!!! " + Файл.ПолноеИмя);
				Продолжить;
			КонецЕсли; 
		КонецЕсли; 
		
		Текст = Новый ЧтениеТекста;
		Текст.Открыть(ИмяФайла,"UTF-8");
		
		НашлиТегExportScenarios = Ложь;
		НомерСтроки = 0;
		ДобавлятьШаги = Ложь;
		Пока Истина Цикл
			Стр = Текст.ПрочитатьСтроку();
			Если Стр = Неопределено Тогда
				Прервать;
			КонецЕсли;	 
			
			НомерСтроки = НомерСтроки + 1;
			
			Стр = СокрЛП(Стр);
			СтрНРег = НРег(Стр);
			
			Если Стр = "" Тогда
				Продолжить;
			КонецЕсли;	 
			
			Если СтрНРег = "@exportscenarios" Тогда
				НашлиТегExportScenarios = Истина;
			КонецЕсли;	 
			
			Если Лев(СтрНРег,1) = "@" Тогда
				Продолжить;
			КонецЕсли;	 
			Если Лев(СтрНРег,1) = "#" Тогда
				Продолжить;
			КонецЕсли;	 
			
			Если НашлиТегExportScenarios Тогда
				Если Лев(СтрНРег,9) = "сценарий:" Тогда
					ДобавлятьШаги = Истина;
					ИмяСценария = СокрЛП(Сред(Стр,10));
					ТаблицаШагов = Новый Массив;
					//Сообщить("НомерСтроки="+НомерСтроки);
					ТаблицаУжеСуществующихСценариев.Добавить(ПолучитьСтруктуруДляСценария(ИмяСценария,ИмяФайла,ТаблицаШагов));
					Продолжить;
				ИначеЕсли Лев(СтрНРег,19) = "структура сценария:" Тогда
					ДобавлятьШаги = Ложь;
					Продолжить;
				КонецЕсли;	
				
				Если ДобавлятьШаги Тогда
					ТаблицаШагов.Добавить(Стр);
				КонецЕсли;	 
			КонецЕсли;	 
		КонецЦикла;	
		
		Текст.Закрыть();
		
	КонецЦикла;
	
	
	
КонецПроцедуры

Функция ПолучитьСтруктуруДляСценария(ИмяСценария,ИмяФайла,ТаблицаШагов)
	Структура = Новый Структура;
	Структура.Вставить("ИмяСценария",ИмяСценария);
	Структура.Вставить("ИмяФайла",ИмяФайла);
	Структура.Вставить("ТаблицаШагов",ТаблицаШагов);
	Структура.Вставить("ДвоичныеДанные",Новый ДвоичныеДанные(ИмяФайла));
	
	//Сообщить("ИмяСценария="+ИмяСценария + ", " + ИмяФайла);
	
	Возврат Структура;
КонецФункции	


Процедура ЗагрузитьФичи() Экспорт
	ПарсерФич = ПолучитьИнструментПарсерФич();
	
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("КаталогИнструментов",КаталогИнструментов);
	СтруктураПараметров.Вставить("КаталогФич",КаталогФич);
	
	МассивСообщений = Новый Массив;
	СтруктураПараметров.Вставить("МассивСообщений",МассивСообщений);
	СтруктураПараметров.Вставить("DebugLog",DebugLog);
	СтруктураПараметров.Вставить("КонтекстVanessaBehavoir",ЭтотОбъект);
	СтруктураПараметров.Вставить("КаталогиБиблиотек",КаталогиБиблиотек);
	СтруктураПараметров.Вставить("СписокТеговИсключение",СписокТеговИсключение);
	СтруктураПараметров.Вставить("СписокТеговОтбор",СписокТеговОтбор);
	
	
	
	
	
	
	ПутьКФичам = Новый Файл(КаталогФич);
	Путь = ПутьКФичам.ПолноеИмя;
	Если Не ПутьКФичам.Существует() Тогда
		ВызватьИсключение "Путь к фичам <" + КаталогФич + "> не существует!";
	КонецЕсли;	 
	
	Если ПутьКФичам.ЭтоФайл() Тогда
		Путь = ПутьКФичам.Путь;
		СтруктураПараметров.Вставить("ИдетЗагрузкаИзКаталога",Ложь);
	КонецЕсли;	 
	
	
	МассивОбработанныхФайлов = Новый Массив;
	ДополнительныеПараметры = Неопределено;
	
	ПолучитьУжеСуществующиеСценарииИзФич(Путь,ДополнительныеПараметры,МассивОбработанныхФайлов);
	Для каждого Элем Из КаталогиБиблиотек Цикл
		ПолучитьУжеСуществующиеСценарииИзФич(Элем.Значение,ДополнительныеПараметры,МассивОбработанныхФайлов);
	КонецЦикла;
	
	СтруктураПараметров.Вставить("ТаблицаУжеСуществующихСценариевУФ",ТаблицаУжеСуществующихСценариев);
	ТаблицаУжеСуществующихСценариевСервер = ПреобразоватьМассивТаблицаУжеСуществующихСценариевВТаблицуЗначений(СтруктураПараметров.ТаблицаУжеСуществующихСценариевУФ);
	СтруктураПараметров.Вставить("ТаблицаУжеСуществующихСценариев",ТаблицаУжеСуществующихСценариевСервер);
	
	СтруктураПараметров.Вставить("ТаблицаИзвестныхStepDefinition",ТаблицаИзвестныхStepDefinition);
	СтруктураПараметров.Вставить("ТаблицаВерсийEPF",ТаблицаВерсийEPF);
	СтруктураПараметров.Вставить("ТаблицаВерсийFeature",ТаблицаВерсийFeature);
	
	
	
	
	Попытка
		ДеревоФич = ПарсерФич.ПолучитьДеревоФич(СтруктураПараметров);
	Исключение
		СделатьСообщение("Ошибка при постсроении дерева.");
		СделатьСообщение("" + ОписаниеОшибки());
		Возврат;
	КонецПопытки;
	
	Для каждого Элем Из МассивСообщений Цикл
		СделатьСообщение(Элем);
	КонецЦикла;
	
	Если ДеревоФич = Неопределено Тогда
		Возврат;
	КонецЕсли;	 
	
	СкопироватьДеревоНаФорму(ДеревоФич);
	
	РазврнутьДеревоДоСценариев(ДеревоТестов);
	
	
	СделатьСообщение("Фичи загружены.");
	//ПарсерФич.ВычислитьСнипетыДляШагов();
КонецПроцедуры
 
Функция ПреобразоватьМассивТаблицаУжеСуществующихСценариевВТаблицуЗначений(ИсходныйМассив)
	Тзн = Новый ТаблицаЗначений;
	Тзн.Колонки.Добавить("ИмяСценария");
	Тзн.Колонки.Добавить("ИмяФайла");
	Тзн.Колонки.Добавить("ТаблицаШагов");
	Тзн.Колонки.Добавить("ДвоичныеДанные");
	Для каждого Элем Из ИсходныйМассив Цикл
		СтрТзн = Тзн.Добавить();
		
		СтрТзн.ИмяСценария  = Элем.ИмяСценария;
		СтрТзн.ИмяФайла     = Элем.ИмяФайла;
		СтрТзн.ТаблицаШагов = Элем.ТаблицаШагов;
		СтрТзн.ДвоичныеДанные = Элем.ДвоичныеДанные;
	КонецЦикла;
	
	Возврат Тзн;
КонецФункции	


Процедура ЗагрузитьТестыЗагрузитьФичиИзКаталога()
	ОчиститьСообщения();
	
	Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		КаталогФич = ДиалогОткрытияФайла.Каталог;
	Иначе
		Возврат;
	КонецЕсли;
 
	ЗагрузитьФичи();
КонецПроцедуры
 
Процедура ЗагрузитьТестыЗагрузитьОднуФичу()
	ОчиститьСообщения();
	
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.Заголовок = "Выберите feature файл";
	ДиалогОткрытияФайла.Фильтр = "Фича файл (*.feature)|*.feature";
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		КаталогФич = ДиалогОткрытияФайла.ПолноеИмяФайла;
	Иначе
		Возврат;
	КонецЕсли;
 
	ЗагрузитьФичи();
КонецПроцедуры
 
Процедура ОбновитьКнопкуЗагрузитьФичи()
	Если текЗначениеОперации = "ЗагрузитьФичиИзКаталога" Тогда
		ЭлементыФормы.кнЗагрузитьФичи.Заголовок = "Загрузить фичи из каталога";
	ИначеЕсли текЗначениеОперации = "ЗагрузитьОднуФичу" Тогда
		ЭлементыФормы.кнЗагрузитьФичи.Заголовок = "Загрузить одну фичу";
	ИначеЕсли текЗначениеОперации = "" Тогда
	Иначе	
		Стр = "Ошибка! Неизвестное значение параметра текЗначениеОперации = " + текЗначениеОперации;
		СделатьСообщение(Стр);	
		ВызватьИсключение Стр;
	КонецЕсли;	 
КонецПроцедуры
 
 
Процедура КнЗагрузитьТестыЗагрузитьФичиИзКаталога(Кнопка)
	текЗначениеОперации = "ЗагрузитьФичиИзКаталога";
	ОбновитьКнопкуЗагрузитьФичи();
	ЗагрузитьТестыЗагрузитьФичиИзКаталога();
КонецПроцедуры
 
Процедура КнЗагрузитьФичиЗагрузитьОднуФичу(Кнопка)
	текЗначениеОперации = "ЗагрузитьОднуФичу";
	ОбновитьКнопкуЗагрузитьФичи();
	ЗагрузитьТестыЗагрузитьОднуФичу();
КонецПроцедуры
 
Процедура ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки)
	//Если ДанныеСтроки.Статус = "Success" Тогда
	//	Если ДанныеСтроки.Шаг = Истина Тогда
	//		ОформлениеСтроки.Ячейки.ПиктограммаСостояния.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаЗеленый.Картинка);		
	//	ИначеЕсли (ДанныеСтроки.Сценарий = Истина) или (ДанныеСтроки.Пример = Истина) Тогда
	//		ОформлениеСтроки.Ячейки.Имя.ЦветФона = ЦветУспешно;
	//	КонецЕсли; 
	//ИначеЕсли ДанныеСтроки.Статус = "Pending" Тогда
	//	Если ДанныеСтроки.Шаг = Истина Тогда
	//		ОформлениеСтроки.Ячейки.ПиктограммаСостояния.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаЖелтый.Картинка);		
	//	ИначеЕсли (ДанныеСтроки.Сценарий = Истина) или (ДанныеСтроки.Пример = Истина) Тогда
	//		ОформлениеСтроки.Ячейки.Имя.ЦветФона = ЦветОжидает;
	//	КонецЕсли;	
	//ИначеЕсли ДанныеСтроки.Статус = "Failed" Тогда
	//	Если ДанныеСтроки.Шаг = Истина Тогда
	//		ОформлениеСтроки.Ячейки.ПиктограммаСостояния.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаКрасный.Картинка);		
	//	ИначеЕсли (ДанныеСтроки.Сценарий = Истина) или (ДанныеСтроки.Пример = Истина) Тогда
	//		ОформлениеСтроки.Ячейки.Имя.ЦветФона = ЦветНеУспешно;
	//	КонецЕсли;	
	//КонецЕсли; 
КонецПроцедуры
 
 
Процедура тпДеревоТестовПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	Если ДанныеСтроки.Каталог = Истина Тогда
		ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиКаталогТестов.Картинка);		
	ИначеЕсли ДанныеСтроки.Фича = Истина Тогда
		ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиФича.Картинка);		
		ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки);
	ИначеЕсли ДанныеСтроки.ЭтоКонтекст = Истина Тогда
		ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиКонтекст.Картинка);		
		ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки);
	ИначеЕсли ДанныеСтроки.Сценарий = Истина Тогда
		ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиСценарий.Картинка);		
		ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки);
	ИначеЕсли ДанныеСтроки.Шаг = Истина Тогда
		
		Если ДанныеСтроки.Статус = "Success" Тогда
			ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаЗеленый.Картинка);		
		ИначеЕсли ДанныеСтроки.Статус = "Pending" Тогда
			ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаЖелтый.Картинка);		
		ИначеЕсли ДанныеСтроки.Статус = "Failed" Тогда
			ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиПометкаКрасный.Картинка);		
		Иначе	
			ОформлениеСтроки.Ячейки.Имя.УстановитьКартинку(ЭлементыФормы.ПолеКартинкиШагСерый.Картинка);		
		КонецЕсли; 
		
		
		ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки);
		
		Если ДанныеСтроки.ЭтоЧужойСнипет = Истина Тогда
			ОформлениеСтроки.Ячейки.ПолныйПуть.ЦветФона = ЦветЧужойСнипет;
			ОформлениеСтроки.Ячейки.Снипет.ЦветФона = ЦветЧужойСнипет;
			ОформлениеСтроки.Ячейки.АдресСнипета.ЦветФона = ЦветЧужойСнипет;
		КонецЕсли; 
	ИначеЕсли (ДанныеСтроки.Пример = Истина) или (ДанныеСтроки.СтрокаПараметровШагаВВидеТаблицы = Истина) Тогда
		ОформлениеСтроки.Шрифт = Новый Шрифт("Lucida Console",10);
		ОбновитьИконкуСтатуса(ОформлениеСтроки,ДанныеСтроки);
	КонецЕсли;	 
КонецПроцедуры
 
Процедура кнЗагрузитьФичиНажатие(Элемент)
	Если текЗначениеОперации = "" Тогда
		ЗагрузитьТестыЗагрузитьФичиИзКаталога();
		Возврат;
	КонецЕсли;	 
	
	Если текЗначениеОперации = "ЗагрузитьФичиИзКаталога" Тогда
		ЗагрузитьТестыЗагрузитьФичиИзКаталога();
	ИначеЕсли текЗначениеОперации = "ЗагрузитьОднуФичу" Тогда
		ЗагрузитьТестыЗагрузитьОднуФичу();
	Иначе
		Стр = "Ошибка! Неизвестное значение параметра текЗначениеОперации = " + текЗначениеОперации;
		СделатьСообщение(Стр);	
		ВызватьИсключение Стр;
	КонецЕсли;	 
	
КонецПроцедуры
 
Процедура кнПерезагрузитьНажатие(Элемент)
	ЗагрузитьФичи();
КонецПроцедуры
 
Процедура ОбновлениеОтображения()
	ЭлементыФормы.нКаталогФич1.Заголовок = КаталогФич;
	ЭлементыФормы.нКаталогФич2.Заголовок = КаталогФич;
КонецПроцедуры

Процедура КонтекстноеМенюДеревоВыполнитьОдинСценарий(Кнопка)
	ТекСтрокаДерева = ЭлементыФормы.тпДеревоТестов.ТекущаяСтрока;
	Если ТекСтрокаДерева.Сценарий = Истина Тогда
		ВыполнитьСценарии(ТекСтрокаДерева);
	ИначеЕсли ТекСтрокаДерева.Пример = Истина Тогда
		ВыполнитьСценарии(ТекСтрокаДерева);
	Иначе
		СделатьСообщение("Это не строка сценария.");
	КонецЕсли; 
	
КонецПроцедуры

Процедура КонтекстноеМенюДеревоОткрытьФичаФайл(Кнопка)
	ЗапуститьПриложение(ЭлементыФормы.тпДеревоТестов.ТекущиеДанные.ПолныйПуть);
КонецПроцедуры
 
 





Функция ПолучитьВременнуюФичу(Стр)
	ИмяФайла = ПолучитьИмяВременногоФайла("feature");
	
	ЗТ = Новый ЗаписьТекста(ИмяФайла,"UTF-8",,Истина); 
	ЗТ.ЗаписатьСтроку("Функционал: Тест"); 
	ЗТ.ЗаписатьСтроку("Сценарий: Тестовый сценарий"); 
	ЗТ.ЗаписатьСтроку(Стр); 
	
	ЗТ.Закрыть();
	
	Возврат ИмяФайла; 
КонецФункции	

Функция ПолучитьПутьКFeatureReader()
	ПутьКФайлу = КаталогИнструментов + "\vbFeatureReader.epf";
	
	Возврат ПутьКФайлу;
КонецФункции


Функция СоздатьСтруктураПараметровДляЗагрузкиШага(ПутьЗагрузки)
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("DebugLog",DebugLog);
	СтруктураПараметров.Вставить("ДополнительныеПараметры",Неопределено);
	СтруктураПараметров.Вставить("ИдетЗагрузкаИзКаталога",Ложь);
	СтруктураПараметров.Вставить("КаталогИнструментов",КаталогИнструментов);
	СтруктураПараметров.Вставить("КаталогФич",ПутьЗагрузки);
	СтруктураПараметров.Вставить("КаталогиБиблиотек",КаталогиБиблиотек);
	СтруктураПараметров.Вставить("МассивРезультатОбходаКаталогов",Новый Массив);
	СтруктураПараметров.Вставить("МассивСообщений",Новый Массив);
	//СтруктураПараметров.Вставить("ПутьКОбработке",Объект.DebugLog);
	СтруктураПараметров.Вставить("СписокТеговИсключение",СписокТеговИсключение);
	СтруктураПараметров.Вставить("СписокТеговОтбор",СписокТеговОтбор);
	СтруктураПараметров.Вставить("УдалитьСтрокуФичиИзДерева",Ложь);
	
	СтруктураПараметров.Вставить("ТаблицаУжеСуществующихСценариевУФ",ТаблицаУжеСуществующихСценариев);
	ТаблицаУжеСуществующихСценариевСервер = ПреобразоватьМассивТаблицаУжеСуществующихСценариевВТаблицуЗначений(СтруктураПараметров.ТаблицаУжеСуществующихСценариевУФ);
	
	СтруктураПараметров.Вставить("ТаблицаУжеСуществующихСценариев",ТаблицаУжеСуществующихСценариевСервер);
	
	
	ДвДанныеvbFeatureReader = Новый ДвоичныеДанные(ПолучитьПутьКFeatureReader());
	СтруктураПараметров.Вставить("ДвДанныеvbFeatureReader",ДвДанныеvbFeatureReader);
	
	Возврат СтруктураПараметров;
КонецФункции	



Процедура ПолучитьШагиИзДерева(ДеревоСтроки,Шаги)
	Для каждого СтрокаДерева Из ДеревоСтроки Цикл
		Если СтрокаДерева.Шаг = Истина Тогда
			Шаг = Новый Структура;
			Шаг.Вставить("Имя",СтрокаДерева.Имя);
			Шаг.Вставить("СтрокаРеальнойПроцедуры",СтрокаДерева.СтрокаРеальнойПроцедуры);
			Шаг.Вставить("ЗначенияПараметров",СтрокаДерева.ЗначенияПараметров);
			Шаг.Вставить("АдресСнипета",СтрокаДерева.АдресСнипета);
			
			Шаги.Добавить(Шаг);
		Иначе	
			ПолучитьШагиИзДерева(СтрокаДерева.Строки,Шаги);
		КонецЕсли;	 
	КонецЦикла;
КонецПроцедуры	

Процедура ЗагрузитьВременнуюФичуСервер(СтруктураПараметров)
	
	FeatureReader = ВнешниеОбработки.Создать(ПолучитьПутьКFeatureReader(),Ложь);
	
	Дерево = Новый ДеревоЗначений;
	СоздатьКолонкиДерева(Дерево);
	ПерваяСтрокаДерева = Дерево.Строки.Добавить();
	ПерваяСтрокаДерева.Имя = "Фичи";
	ПерваяСтрокаДерева.ПолныйПуть = "";
	
	FeatureReader.ЗагрузитьФичу(СтруктураПараметров.КаталогФич,ПерваяСтрокаДерева.Строки,ТаблицаИзвестныхStepDefinition,СтруктураПараметров);
	Шаги = Новый Массив;
	ПолучитьШагиИзДерева(Дерево.Строки,Шаги);
	
	СтруктураПараметров.Вставить("Шаги",Шаги);	
КонецПроцедуры

Процедура ШагФорма(Стр) Экспорт
	
	ВременнаяФича = ПолучитьВременнуюФичу(Стр);
	
	СтруктураПараметров = СоздатьСтруктураПараметровДляЗагрузкиШага(ВременнаяФича);
	ЗагрузитьВременнуюФичуСервер(СтруктураПараметров);
	
	Шаги = СтруктураПараметров.Шаги;
	Для каждого ТекШаг Из Шаги Цикл
		Если Не ЗначениеЗаполнено(ТекШаг.АдресСнипета) Тогда
			ВызватьИсключение "Для шага <" + ТекШаг.Имя + "> не найден EPF файл!";
		КонецЕсли;	 
		
		ИмяПроцедуры     = ТекШаг.СтрокаРеальнойПроцедуры;
		СписокАргументов = ТекШаг.ЗначенияПараметров;
		
		МассивПараметров = ПолучитьМассивПараметровИзСписокАргументов(СписокАргументов);
		
		АдресСнипета = ТекШаг.АдресСнипета;
		ОбработкаТеста = ПолучитьКонтекстТестаПоАдресСнипета(АдресСнипета);
		
		ПодготовитьИВызватьМетод(ТекШаг,ОбработкаТеста,ИмяПроцедуры,МассивПараметров);
		
	КонецЦикла;
	
КонецПроцедуры




 
 
//WinSocket1 = ЭлементыФормы.WinSocket;
//СтримAdobe = Новый COMОбъект("Adodb.Stream");
 
//RegExp            = Новый COMОбъект("VBScript.RegExp");
//RegExp.IgnoreCase = Истина; //Игнорировать регистр
//RegExp.Global     = Истина; //Поиск всех вхождений шаблона
//RegExp.MultiLine  = Ложь; //Многострочный режим
 
ЭтоУФ = Ложь;
 
 
СоздатьКолонкиДерева(ДеревоТестов);

 
ШагСтрокДляМодуля    = 10000;
 
 
ВыполнятьСценарииАсинхронно = Истина;
 
ЦветУспешно     = Новый Цвет(154,250,117);
ЦветОжидает     = Новый Цвет(244,255,91);
ЦветНеУспешно   = Новый Цвет(255,53,35);
ЦветЧужойСнипет = Новый Цвет(192,192,192);



СтруктураПараметровДляСамотестирования = Новый Структура;


ТаблицаИзвестныхStepDefinition = Новый ТаблицаЗначений;
ТаблицаИзвестныхStepDefinition.Колонки.Добавить("ИмяФайла");
ТаблицаИзвестныхStepDefinition.Колонки.Добавить("Id");
ТаблицаИзвестныхStepDefinition.Колонки.Добавить("СтрокаРеальнойПроцедуры");
ТаблицаИзвестныхStepDefinition.Колонки.Добавить("Параметры");


ТаблицаВерсийEPF = Новый ТаблицаЗначений;
ТаблицаВерсийEPF.Колонки.Добавить("ИмяФайла");
ТаблицаВерсийEPF.Колонки.Добавить("ВерсияФайла");

ТаблицаВерсийFeature = Новый ТаблицаЗначений;
ТаблицаВерсийFeature.Колонки.Добавить("ИмяФайла");
ТаблицаВерсийFeature.Колонки.Добавить("ВерсияФайла");

ТаблицаУжеСуществующихСценариев = Новый Массив();

//где читать про Аллюр репорт
//https://github.com/allure-framework/allure-core/wiki/Creating-Allure-Adapter
//пример xml Allure
//https://github.com/allure-framework/allure-core/blob/master/allure-model/src/test/resources/allure-results/d7ecfd47-8020-4c04-9fd5-3981fa856228-testsuite.xml